package disenioPantallas.datosDelSistema;

import disenioPantallas.elementos.EButton;
import disenioPantallas.elementos.EComboBox;
import disenioPantallas.elementos.ELabel;
import disenioPantallas.elementos.EPanel;
import disenioPantallas.elementos.ETextField;
import disenioPantallas.elementos.FrameAutenticado;
import disenioPantallas.elementos.panelGeneral;
import entidades.Campo;
import entidades.Especie;
import gestores.GestorCampo;
import gestores.GestorErrores;
import gestores.GestorSistema;

import javax.swing.AbstractAction;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextField;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.border.TitledBorder;

import java.awt.FlowLayout;
import java.util.Vector;

import javax.swing.UIManager;
import javax.swing.SwingConstants;

import actionListeners.MascaraMayusculakeyListener;


public class DatosSistema extends panelGeneral {

	private static final long serialVersionUID = 1L;
	
	
	private Vector<Campo> campos;
	private Vector<String> nombreCampos;
	private ETextField txActividad;

	private Vector<Especie> especiesEncontradas=new Vector<Especie>();
	private GestorSistema gSistema=GestorSistema.getGestorSistema();
	private GestorErrores gError=GestorErrores.getGestorErrores();
	private JTextField txEspecie;
	private EComboBox cbEspecieRaza;
	private ETextField txRaza;
	private EComboBox cbEspecieCategoria;
	private ETextField txCategoria;
	private EComboBox cbSexoCategoria;
	private ETextField txCampo;
	private EComboBox cbCampoPotrero;
	private ETextField txPotrero;
	
	private GestorCampo gCampo=GestorCampo.getGestorCampo();

	private boolean flagCU=false; // false si el cu es animal y true si el cu es campo
	private JPanel panelCentral;
	
	public DatosSistema() {
		super();
		setPreferredSize(new Dimension(900, 700));
		setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
		
		Component verticalStrut_2 = Box.createVerticalStrut(20);
		add(verticalStrut_2);

		JPanel panelTitulo = new JPanel();
		panelTitulo.setOpaque(false);
		add(panelTitulo);
		panelTitulo.setLayout(new BoxLayout(panelTitulo, BoxLayout.X_AXIS));
		
		ELabel lbTitulo = new ELabel("Datos del Sistema");
		panelTitulo.add(lbTitulo);
		lbTitulo.setFont(new Font("Cambria", Font.PLAIN, 24));
		
		Component verticalStrut = Box.createVerticalStrut(35);
		add(verticalStrut);

		
		panelCentral = new JPanel();
		panelCentral.setOpaque(false);
		add(panelCentral);
		
		panelCentral.setLayout(new BoxLayout(panelCentral, BoxLayout.X_AXIS));
		JPanel panelAnimal=new DatosAnimalSistema();
		panelCentral.add(panelAnimal);
				
				JPanel panelBotones = new JPanel();
				panelBotones.setOpaque(false);
				panelBotones.setMaximumSize(new Dimension(32767, 100));
				add(panelBotones);
				panelBotones.setLayout(new BoxLayout(panelBotones, BoxLayout.Y_AXIS));
				
				JPanel panel = new JPanel();
				panel.setOpaque(false);
				panelBotones.add(panel);
				
				JButton btnAnimal = new EButton("ANIMAL");
				panel.add(btnAnimal);
				btnAnimal.setActionCommand("ANIMAL");
				
				JButton btnCampo = new EButton("CAMPO");
				panel.add(btnCampo);
				btnCampo.setActionCommand("CAMPO");
				
				btnCampo.addActionListener(new IntercambioAction());
				btnAnimal.addActionListener(new IntercambioAction());
				
				Component verticalGlue = Box.createVerticalGlue();
				panelBotones.add(verticalGlue);
				
				JPanel panelSalir = new JPanel();
				panelSalir.setOpaque(false);
				panelBotones.add(panelSalir);
				
				JButton btnSalir = new EButton("Salir");
				panelSalir.add(btnSalir);
				btnSalir.addActionListener(new ActionListener() {
					
					@Override
					public void actionPerformed(ActionEvent arg0) {
						((FrameAutenticado) gSistema.getFrame()).quitarCU();} });
				}
	
	private class DatosAnimalSistema extends JPanel{
		/**
		 * 
		 */
		private static final long serialVersionUID = 1L;
		private Vector<String> nombreEspecie=new Vector<String>();
		private Vector<String> nombreSexo;

		public DatosAnimalSistema(){
			super();
			setMaximumSize(new Dimension(600, 400));
			setPreferredSize(new Dimension(60, 400));
			setMinimumSize(new Dimension(600, 400));
			setOpaque(false);
			setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
			
			JPanel panelEspecie = new EPanel();
			FlowLayout flowLayout = (FlowLayout) panelEspecie.getLayout();
			flowLayout.setVgap(2);
			panelEspecie.setMaximumSize(new Dimension(600, 90));
			panelEspecie.setBorder(new TitledBorder(null, "Nueva Especie", TitledBorder.LEADING, TitledBorder.TOP, null, null));
			add(panelEspecie);
			
			JPanel panel_16 = new EPanel();
			panel_16.setPreferredSize(new Dimension(450, 45));
			panel_16.setMaximumSize(new Dimension(600, 45));
			panelEspecie.add(panel_16);
			
			ELabel lblNombre = new ELabel("Nombre: ");
			panel_16.add(lblNombre);
			lblNombre.setHorizontalAlignment(SwingConstants.LEFT);
			lblNombre.setFont(new Font("Cambria", Font.PLAIN, 16));
			
			txEspecie = new ETextField();
			panel_16.add(txEspecie);
			
			JButton btnAgregarEspecie = new EButton("AGREGAR");
			panel_16.add(btnAgregarEspecie);
			btnAgregarEspecie.addActionListener(new EspecieAction());
			
			Component verticalStrut_3 = Box.createVerticalStrut(20);
			add(verticalStrut_3);
			
			EPanel panelRaza = new EPanel();
			panelRaza.setMaximumSize(new Dimension(600, 140));
			panelRaza.setBorder(new TitledBorder(null, "Nueva Raza", TitledBorder.LEADING, TitledBorder.TOP, null, null));
			add(panelRaza);
			panelRaza.setLayout(new BoxLayout(panelRaza, BoxLayout.Y_AXIS));
			
			JPanel panel_11 = new EPanel();
			panel_11.setMaximumSize(new Dimension(450, 45));
			panel_11.setPreferredSize(new Dimension(450, 45));
			panelRaza.add(panel_11);
			
			ELabel lbEspecie = new ELabel("Especie:");
			lbEspecie.setHorizontalAlignment(SwingConstants.LEFT);
			lbEspecie.setFont(new Font("Cambria", Font.PLAIN, 16));
			panel_11.add(lbEspecie);
			
			cbEspecieRaza = new EComboBox();
			panel_11.add(cbEspecieRaza);
			
			Component horizontalStrut = Box.createHorizontalStrut(150);
			panel_11.add(horizontalStrut);
			
			JPanel panel_10 = new EPanel();
			panel_10.setMaximumSize(new Dimension(450, 45));
			panelRaza.add(panel_10);
			
			ELabel label = new ELabel("Nombre: ");
			label.setHorizontalAlignment(SwingConstants.LEFT);
			panel_10.add(label);
			label.setFont(new Font("Cambria", Font.PLAIN, 16));
			
			txRaza = new ETextField();
			panel_10.add(txRaza);
			
			EButton btnAgregarRaza = new EButton("AGREGAR");
			panel_10.add(btnAgregarRaza);
			btnAgregarRaza.addActionListener(new RazaAction());
			
			Component verticalStrut_4 = Box.createVerticalStrut(20);
			add(verticalStrut_4);
			
			EPanel panel_12 = new EPanel();
			panel_12.setMaximumSize(new Dimension(600, 195));
			panel_12.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Nueva Categoria", TitledBorder.LEADING, TitledBorder.TOP, null, null));
			add(panel_12);
			panel_12.setLayout(new BoxLayout(panel_12, BoxLayout.Y_AXIS));
			
			EPanel panel_13 = new EPanel();
			panel_13.setMaximumSize(new Dimension(450, 45));
			panel_12.add(panel_13);
			
			ELabel label_2 = new ELabel("Especie:");
			label_2.setHorizontalAlignment(SwingConstants.LEFT);
			label_2.setFont(new Font("Cambria", Font.PLAIN, 16));
			panel_13.add(label_2);
			
			cbEspecieCategoria = new EComboBox();
			panel_13.add(cbEspecieCategoria);
			
			Component horizontalStrut_1 = Box.createHorizontalStrut(150);
			panel_13.add(horizontalStrut_1);
			
			EPanel panel_15 = new EPanel();
			panel_15.setMaximumSize(new Dimension(450, 45));
			panel_12.add(panel_15);
			
			ELabel lblSexo = new ELabel("Sexo:");
			lblSexo.setHorizontalAlignment(SwingConstants.LEFT);
			lblSexo.setFont(new Font("Cambria", Font.PLAIN, 16));
			panel_15.add(lblSexo);
			
			cbSexoCategoria = new EComboBox();
			panel_15.add(cbSexoCategoria);
			
			Component horizontalStrut_2 = Box.createHorizontalStrut(150);
			panel_15.add(horizontalStrut_2);
			
			JPanel panel_14 = new EPanel();
			panel_14.setMaximumSize(new Dimension(450, 45));
			panel_12.add(panel_14);
			
			ELabel label_1 = new ELabel("Nombre: ");
			label_1.setHorizontalAlignment(SwingConstants.LEFT);
			panel_14.add(label_1);
			label_1.setFont(new Font("Cambria", Font.PLAIN, 16));
			
			txCategoria = new ETextField();
			panel_14.add(txCategoria);
			
			EButton btnAgregarCategoria = new EButton("AGREGAR");
			panel_14.add(btnAgregarCategoria);
			btnAgregarCategoria.addActionListener(new CategoriaAction());
			
			Component verticalStrut_5 = Box.createVerticalStrut(20);
			add(verticalStrut_5);
			
			
			try {
				especiesEncontradas= gSistema.getEspeciesEncontradas();
				for(int i=0;i<especiesEncontradas.size();i++){
					if(!nombreEspecie.contains(especiesEncontradas.get(i).getNombreEspecie()))
						nombreEspecie.add(especiesEncontradas.get(i).getNombreEspecie());
					}
				
				cbEspecieRaza.setModel(new DefaultComboBoxModel<>(nombreEspecie));
				cbEspecieRaza.setSelectedIndex(0);
				
				cbEspecieCategoria.setModel(new DefaultComboBoxModel<>(nombreEspecie));
				cbEspecieCategoria.setSelectedIndex(0);
				
				nombreSexo=new Vector<String>();
				nombreSexo.add("MACHO");
				nombreSexo.add("HEMBRA");
				
				cbSexoCategoria.setModel(new DefaultComboBoxModel<>(nombreSexo));
				cbSexoCategoria.setSelectedIndex(0);
				

				
			} catch (Throwable e) {
				gError.mostrarCartelError(e.getMessage());
			}

			
		}
		
	}
	
	private class EspecieAction extends AbstractAction{

		/**
		 * 
		 */
		private static final long serialVersionUID = 1L;

		public void actionPerformed(ActionEvent arg0) {
			
			String nombre=txEspecie.getText();
			
			if(!nombre.equals("")){
				try {
					gSistema.registrarEspecie(nombre);
					gError.mostrarCartelAdvertencia("Se ha registrado correctamente");
					txEspecie.setText("");
				} catch (Throwable e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					gError.mostrarCartelError(e.getMessage());
				}
			}else
				gError.mostrarCartelError("Ingrese la especie");
				
			
		}
		
	}
	
	private class RazaAction extends AbstractAction{

		/**
		 * 
		 */
		private static final long serialVersionUID = 1L;

		@Override
		public void actionPerformed(ActionEvent arg0) {
			String raza= txRaza.getText();
			String especie=(String) cbEspecieRaza.getSelectedItem();
			int idEspecie=-1;
			for(int i=0;i<especiesEncontradas.size();i++){
				if(especiesEncontradas.get(i).getNombreEspecie().equals(especie)) idEspecie=especiesEncontradas.get(i).getIdEspecie();
			}
			
			if((!raza.equals("")) && idEspecie!=-1){
				
				
				try {
					gSistema.registrarRaza(raza,idEspecie);
					gError.mostrarCartelAdvertencia("Se ha registrado correctamente");
					txRaza.setText("");
				} catch (Throwable e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					gError.mostrarCartelError(e.getMessage());
				}


				
			}else
				gError.mostrarCartelError("Ingrese la raza");

			
			
		}
		
		
		
	}
	
	private class CategoriaAction extends AbstractAction{

		/**
		 * 
		 */
		private static final long serialVersionUID = 1L;

		@Override
		public void actionPerformed(ActionEvent arg0) {
			String categoria= txCategoria.getText();
			String especie=(String) cbEspecieCategoria.getSelectedItem();
			String sexo=(String) cbSexoCategoria.getSelectedItem();
			int idEspecie=-1;
			for(int i=0;i<especiesEncontradas.size();i++){
				if(especiesEncontradas.get(i).getNombreEspecie().equals(especie)) idEspecie=especiesEncontradas.get(i).getIdEspecie();
			}
			
			if((!categoria.equals("")) && idEspecie!=-1){
				
				
				try {
					gSistema.registrarCategoria(categoria,sexo,idEspecie);
					gError.mostrarCartelAdvertencia("Se ha registrado correctamente");
					txCategoria.setText("");
				} catch (Throwable e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					gError.mostrarCartelError(e.getMessage());
				}


				
			}else
				gError.mostrarCartelError("Ingrese la raza");

			
			
		}
		
		
		
	}
	
	private class IntercambioAction extends AbstractAction{

		
		/**
		 * 
		 */
		private static final long serialVersionUID = 1L;

		public void actionPerformed(ActionEvent arg0) {
			JButton boton=(JButton) arg0.getSource();
			
			if(boton.getActionCommand().equals("ANIMAL")){
				if(flagCU){
					flagCU=false;
					panelCentral.removeAll();
					JPanel animal=new DatosAnimalSistema();
					panelCentral.add(animal);
				}
				
			}
			else if(boton.getActionCommand().equals("CAMPO")){
				if(!flagCU){
					flagCU=true;
					panelCentral.removeAll();
					JPanel campo=new DatosCampoSistema();
					panelCentral.add(campo);
				}
				
			}
		}
		
	}
	
	private class DatosCampoSistema extends JPanel{
		
		/**
		 * 
		 */
		private static final long serialVersionUID = 1L;


		public DatosCampoSistema(){
			super();
			setMaximumSize(new Dimension(600, 400));
			setPreferredSize(new Dimension(60, 400));
			setMinimumSize(new Dimension(600, 400));
			setOpaque(false);
			setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
			
			JPanel panelEspecie = new EPanel();
			FlowLayout flowLayout = (FlowLayout) panelEspecie.getLayout();
			flowLayout.setVgap(2);
			panelEspecie.setMaximumSize(new Dimension(600, 90));
			panelEspecie.setBorder(new TitledBorder(null, "Nuevo Campo", TitledBorder.LEADING, TitledBorder.TOP, null, null));
			add(panelEspecie);
			
			JPanel panel_16 = new EPanel();
			panel_16.setPreferredSize(new Dimension(450, 45));
			panel_16.setMaximumSize(new Dimension(600, 45));
			panelEspecie.add(panel_16);
			
			ELabel lblNombre = new ELabel("Nombre: ");
			panel_16.add(lblNombre);
			lblNombre.setHorizontalAlignment(SwingConstants.LEFT);
			lblNombre.setFont(new Font("Cambria", Font.PLAIN, 16));
			
			txCampo = new ETextField();
			panel_16.add(txCampo);
			txCampo.addKeyListener(new MascaraMayusculakeyListener());
			
			JButton btnAgregarCampo = new EButton("AGREGAR");
			panel_16.add(btnAgregarCampo);
			btnAgregarCampo.addActionListener(new CampoAction());
			
			Component verticalStrut_3 = Box.createVerticalStrut(20);
			add(verticalStrut_3);
			
			EPanel panelPotrero = new EPanel();
			panelPotrero.setMaximumSize(new Dimension(600, 140));
			panelPotrero.setBorder(new TitledBorder(null, "Nuevo Potrero", TitledBorder.LEADING, TitledBorder.TOP, null, null));
			add(panelPotrero);
			panelPotrero.setLayout(new BoxLayout(panelPotrero, BoxLayout.Y_AXIS));
			
			JPanel panel_11 = new EPanel();
			panel_11.setMaximumSize(new Dimension(450, 45));
			panel_11.setPreferredSize(new Dimension(450, 45));
			panelPotrero.add(panel_11);
			
			ELabel lbEspecie = new ELabel("Campo:");
			lbEspecie.setHorizontalAlignment(SwingConstants.LEFT);
			lbEspecie.setFont(new Font("Cambria", Font.PLAIN, 16));
			panel_11.add(lbEspecie);
			
			cbCampoPotrero = new EComboBox();
			panel_11.add(cbCampoPotrero);
			
			Component horizontalStrut = Box.createHorizontalStrut(150);
			panel_11.add(horizontalStrut);
			
			JPanel panel_10 = new EPanel();
			panel_10.setMaximumSize(new Dimension(450, 45));
			panelPotrero.add(panel_10);
			
			ELabel label = new ELabel("Nombre: ");
			label.setHorizontalAlignment(SwingConstants.LEFT);
			panel_10.add(label);
			label.setFont(new Font("Cambria", Font.PLAIN, 16));
			
			txPotrero = new ETextField();
			panel_10.add(txPotrero);
			txPotrero.addKeyListener(new MascaraMayusculakeyListener());
			
			EButton btnAgregarRaza = new EButton("AGREGAR");
			panel_10.add(btnAgregarRaza);
			btnAgregarRaza.addActionListener(new PotreroAction());
			
			Component verticalStrut_4 = Box.createVerticalStrut(20);
			add(verticalStrut_4);
//			
			JPanel panelActividad = new EPanel();
			FlowLayout flowLayout2 = (FlowLayout) panelActividad.getLayout();
			flowLayout2.setVgap(2);
			panelActividad.setMaximumSize(new Dimension(600, 90));
			panelActividad.setBorder(new TitledBorder(null, "Nueva Actividad", TitledBorder.LEADING, TitledBorder.TOP, null, null));
			add(panelActividad);
			
			JPanel panel_17 = new EPanel();
			panel_17.setPreferredSize(new Dimension(450, 45));
			panel_17.setMaximumSize(new Dimension(600, 45));
			panelActividad.add(panel_17);
			
			ELabel lblActividad = new ELabel("Nombre: ");
			panel_17.add(lblActividad);
			lblActividad.setHorizontalAlignment(SwingConstants.LEFT);
			lblActividad.setFont(new Font("Cambria", Font.PLAIN, 16));
			
			txActividad = new ETextField();
			panel_17.add(txActividad);
			txActividad.addKeyListener(new MascaraMayusculakeyListener());
			
			JButton btnAgregarActividad = new EButton("AGREGAR");
			panel_17.add(btnAgregarActividad);
			btnAgregarActividad.addActionListener(new ActividadAction());
			
			Component verticalStrut_33 = Box.createVerticalStrut(20);
			add(verticalStrut_33);

			
			try {
				campos=gCampo.getCamposEncontrados();
				nombreCampos=new Vector<String>();
				for(int i=0;i<campos.size();i++){
					nombreCampos.add(campos.get(i).getNombreCampo());
				}
				cbCampoPotrero.setModel(new DefaultComboBoxModel<>(nombreCampos));
				
			} catch (Throwable e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				gError.mostrarCartelError(e.getMessage());
			}
				

			
		}

		
	}

	private class ActividadAction extends AbstractAction{

		
		public void actionPerformed(ActionEvent arg0) {
			String nombreActividad=txActividad.getText();
			if(!nombreActividad.equals("")){
				try {
					gSistema.registrarActividad(nombreActividad);
					gError.mostrarCartelAdvertencia("Se ha registrado correctamente");
					txActividad.setText("");
				} catch (Throwable e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					gError.mostrarCartelError(e.getMessage());
				}
			}else
				gError.mostrarCartelError("Ingrese la Actividad");
				
			
		}

		
		
	}

	
	private class CampoAction extends AbstractAction{

		
		public void actionPerformed(ActionEvent arg0) {
			String nombreCampo=txCampo.getText();
			if(!nombreCampo.equals("")){
				try {
					gCampo.registrarCampo(nombreCampo);
					gError.mostrarCartelAdvertencia("Se ha registrado correctamente");
					txCampo.setText("");
				} catch (Throwable e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					gError.mostrarCartelError(e.getMessage());
				}
			}else
				gError.mostrarCartelError("Ingrese El campo");
				
			
		}

		
		
	}
	
	private class PotreroAction extends AbstractAction{

		/**
		 * 
		 */
		private static final long serialVersionUID = 1L;

		@Override
		public void actionPerformed(ActionEvent arg0) {
			String potrero= txPotrero.getText();
			String campo=(String) cbCampoPotrero.getSelectedItem();
			int idCampo=-1;
			for(int i=0;i<campos.size();i++){
				if(campos.get(i).getNombreCampo().equals(campo)) idCampo=campos.get(i).getIdCampo();
			}
			
			if((!potrero.equals("")) && idCampo!=-1){
				
				
				try {
					gCampo.registrarPotrero(potrero,idCampo);
					gError.mostrarCartelAdvertencia("Se ha registrado correctamente");
					txPotrero.setText("");
				} catch (Throwable e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					gError.mostrarCartelError(e.getMessage());
				}


				
			}else
				gError.mostrarCartelError("Ingrese El potrero");

			
			
		}
		
		
		
	}

	@Override
	public void cargarCampos() {
		// TODO Auto-generated method stub
		
	}


	
	
}